home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1993-12-09 | 18.5 KB | 443 lines |
- DEFINITION MODULE term;
- __DEF_SWITCHES__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
- (*****************************************************************************)
- (* Funktionen, die Terminalattribute kontrollieren. *)
- (* *)
- (* Ein Fehler ist immer dann aufgetreten, wenn bei Funktionen mit Typ INTEGER*)
- (* ein negativer Wert zurueckgegeben wird. *)
- (* Die genaue Fehlerursache kann bei Bedarf ueber "err.errno" und die ent- *)
- (* sprechenden Konstanten ermittelt werden. Die Funktionen veraendern "errno"*)
- (* nur dann, wenn ein Fehler aufgetreten ist, bei erfolgreicher Ausfuehrung *)
- (* wird "errno" nicht veraendert. *)
- (* *)
- (* GEMDOS: *)
- (* Die Eigenschaften der Funktionen unter dem ``blanken'' GEMDOS sind z.T. *)
- (* stark eingeschraenkt; unter dem Stichwort GEMDOS ist deswegen immer *)
- (* angegeben, in wieweit die Funktion emuliert werden kann. Ist MiNT-Unter- *)
- (* stuetzung angegeben, so ist unter der Betriebssystemerweiterung MiNT *)
- (* eine bessere Unterstuetzung der Funktionen zu erwarten; wie weit diese *)
- (* geht, ist unter dem Stichwort MiNT angegeben. *)
- (* --------------------------------------------------------------------------*)
- (* 04-Dez-93, Holger Kleinschmidt *)
- (*****************************************************************************)
-
- FROM PORTAB IMPORT
- (* TYPE *) UNSIGNEDWORD;
-
- FROM types IMPORT
- (* TYPE *) pidT, StrPtr;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- CONST
- LCtermid = 128; (* minimale Stringgroesse fuer "ctermid()" *)
-
-
- TYPE (* Flags, die die Ein/Ausgabe beeinflussen *)
- tciflags = (
- IGNCR,
- (* Ein empfangenes CR-Zeichen wird ignoriert (nicht in die Eingabe
- uebernommen. *)
- ICRNL,
- (* Falls IGNCR nicht gesetzt ist, wird ein empfangenes CR-Zeichen
- in ein NL-Zeichen verwandelt (wird zum Zeilenbegrenzer). *)
- INLCR,
- (* Ein empfangenes NL-Zeichen wird in ein CR-Zeichen verwandelt,
- und ist damit kein Zeilenbegrenzer mehr, es sei denn, das EOF-
- oder EOL-Zeichen ist gleich dem CR-Zeichen. *)
- INPCK,
- (* Es wird ein ``Parity-Check'' der Eingabe vorgenommen. *)
- IGNPAR,
- (* Bytes mit ``Parity''- oder ``Framing''-Fehlern werden ignoriert. *)
- PARMRK,
- (* Falls IGNPAR nicht gesetzt ist, wird ein Byte X mit ``Parity''-
- oder ``Framing''-Fehler bei der Eingabe in die Drei-Byte-Sequenz
- 255, 0, X verwandelt. Falls beide Flags nicht gesetzt sind, wird
- ein Fehler als Nullbyte gelesen. *)
- ISTRIP,
- (* Bytes werden Modulo 128 gelesen. Falls das Flag nicht gesetzt
- ist, wird ein Byte mit dem Wert 255 in die Zwei-Byte-Sequenz
- 255, 255 verwandelt. *)
- IGNBRK,
- (* Eine ``Break''-Bedingung (eine bestimmte Zeitspanne nur Nullbits)
- wird ignoriert. Falls 'IGNBRK' und 'BRKINT' geloescht sind, wird
- eine ``Break''-Bedingung als Nullbyte gelesen ('PARMRK' geloescht)
- oder als Drei-Byte-Sequenz 255, 0, 0 ('PARMRK' gesetzt). *)
- BRKINT,
- (* Falls 'IGNBRK' geloescht ist, werden gepufferte Ein- und
- Ausgaben bei einer ``Break''-Bedingung geloescht, und falls
- das Terminal das Kontrollterminal fuer einen Vordergrund-
- Prozess ist, wird ein 'SIGINT'-Signal fuer die entsprechende
- Prozessgruppe ausgeloest. *)
- IXON,
- (* STOP- und START-Zeichen werden nicht in die Eingabe uebernommen,
- sondern stoppen die Terminalausgabe bzw. schalten sie wieder
- ein. Falls das Flag geloescht ist, werden die Zeichen als
- normale Eingaben uebernommen. *)
- IXOFF,
- (* Das System kann STOP- und START-Zeichen senden, damit der
- Eingabepuffer nicht ueberlaeuft ('MAX_INPUT'), bzw. damit
- wieder Zeichen gesendet werden sollen. *)
- tciflag11, tciflag12, tciflag13, tciflag14, tciflag15
- );
-
- TYPE
- tciflagT = PACKEDSET OF tciflags;
-
-
-
-
- TYPE (* Nicht standardisiert *)
- tcoflags = (
- OPOST, (* Implementierungsspezifische Zeichenwandlung bei der Ausgabe *)
- tcoflag1, tcoflag2, tcoflag3, tcoflag4, tcoflag5, tcoflag6,
- tcoflag7, tcoflag8, tcoflag9, tcoflag10, tcoflag11, tcoflag12,
- tcoflag13, tcoflag14, tcoflag15
- );
-
- TYPE
- tcoflagT = PACKEDSET OF tcoflags;
-
-
-
-
- TYPE (* Flags, die die Terminal-Hardware beeinflussen *)
- tccflags = (
- CLOCAL,
- (* *)
- CREAD,
- (* Falls gesetzt, werden Zeichen empfangen, sonst nicht. *)
- CSTOPB,
- (* Falls gesetzt, werden nach jedem Zeichen zwei Stoppbits gesendet *)
- csize0, (* siehe unten *)
- csize1, (* siehe unten *)
- PARENB,
- (* ``Parity''-Pruefung und -Erkennung eingeschaltet *)
- PARODD,
- (* Es wird ``Odd Parity'' verwendet, sonst ``Even Parity''. *)
- HUPCL,
- (* Wenn das Terminal von keinem Prozess mehr geoeffnet ist, wird
- automatisch die Verbindung unterbrochen. *)
-
- tccflag8,
- tccflag9,
- tccflag10,
- tccflag11,
- tccflag12,
- tccflag13,
- tccflag14,
- tccflag15
- );
-
- TYPE
- tccflagT = PACKEDSET OF tccflags;
-
- CONST
- (* Maske und Werte fuer 5,6,7 oder 8 Bit pro Byte *)
- CSIZE = tccflagT{csize0,csize1};
-
- CS5 = tccflagT{};
- CS6 = tccflagT{csize0};
- CS7 = tccflagT{csize1};
- CS8 = tccflagT{csize0,csize1};
-
-
-
- TYPE (* Flags, die fuer Anwendungsprogramme von Interesse sind *)
- tclflags = (
- ICANON,
- (* Terminal ist im ``kanonischen Modus'' (Eingabe wird zeilenweise
- behandelt), sonst im ``Nicht kanonischen Modus'' (keine Zeilen-
- struktur). *)
- ECHO,
- (* Echo bei der Eingabe *)
- ECHOE,
- (* Falls 'ICANON' gesetzt ist, loescht ein 'ERASE'-Zeichen das vorige
- Zeichen vom Bildschirm. *)
- ECHOK,
- (* Falls 'ICANON' gesetzt ist, loescht ein 'KILL'-Zeichen entweder
- die aktuelle Zeile vom Bildschirm oder ein 'NL'-Zeichen wird
- zurueckgesendet. *)
- ECHONL,
- (* Falls 'ICANON' gesetzt ist, erfolgt fuer ein empfangenes 'NL'-Zeichen
- ein Echo, auch wenn 'ECHO' nicht gesetzt ist. *)
- ISIG,
- (* Die Zeichen 'INTR', 'QUIT' und 'SUSP' werden nicht in die Eingabe
- uebernommen, sondern loesen die entsprechende Ausnahme aus. *)
- NOFLSH,
- (* Beim Empfang eines 'INTR'-, 'QUIT'- oder 'SUSP'-Zeichens werden
- gepufferte Ein- und Ausgaben geloescht. *)
- IEXTEN,
- (* Implementierungsspezifische Spezialzeichen und -funktionen werden
- verfuegbar gemacht. *)
- TOSTOP,
- (* Falls ``Job control'' unterstuetzt wird, und ein Hintergrundprozess
- auf sein Kontrollterminal zu schreiben versucht, wird ein 'SIGTTOU'-
- Signal fuer dessen Prozessgruppe generiert. *)
- tclflag9, tclflag10, tclflag11, tclflag12, tclflag13, tclflag14,
- tclflag15
- );
-
- TYPE
- tclflagT = PACKEDSET OF tclflags;
-
-
-
- TYPE
- speedT = (
- B0, (* Fuer Ausgabe: Verbindung aufgeben (``Hang up'')
- Fuer Eingabe: Gleiche Baudrate wie Ausgabe *)
- B50, (* 50 baud *)
- B75, (* 75 baud *)
- B110, (* 110 baud *)
- B134, (* 134 baud *)
- B150, (* 150 baud *)
- B200, (* 200 baud *)
- B300, (* 300 baud *)
- B600, (* 600 baud *)
- B1200, (* 1200 baud *)
- B1800, (* 1800 baud *)
- B2400, (* 2400 baud *)
- B4800, (* 4800 baud *)
- B9600, (* 9600 baud *)
- B19200, (* 19200 baud *)
- B38400 (* 38400 baud *)
- );
-
- TYPE
- ccT = UNSIGNEDWORD; (* ``Multibyte Character'' fuer Spezialzeichen *)
-
- (* Indizes fuer die Spezialzeichen in 'TermiosRec.cCc' *)
- ccIdx = (
- VEOF, (* 'EOF'-Zeichen *)
- VEOL, (* 'EOL'-Zeichen *)
- VERASE, (* 'ERASE'-Zeichen *)
- VKILL, (* 'KILL'-Zeichen *)
- VINTR, (* 'INTR'-Zeichen *)
- VQUIT, (* 'QUIT'-Zeichen *)
- VSUSP, (* 'SUSP'-Zeichen *)
- VSTOP, (* 'STOP'-Zeichen *)
- VSTART, (* 'START'-Zeichen *)
- VMIN, (* 'MIN'-Zeichen *)
- VTIME (* 'TIME'-Zeichen *)
- );
-
- CONST (* Anzahl der konfigurierbaren Spezialzeichen *)
- NCCS = 11; (* ORD(MAX(ccIdx)) + 1 *)
-
- CONST
- (* Diese Spezialzeichen stehen fest *)
- CR = 13;
- NL = 10;
-
-
- TYPE
- TermiosRec = RECORD
- cIflag : tciflagT;
- cOflag : tcoflagT;
- cCflag : tccflagT;
- cLflag : tclflagT;
- #if only_subrange_index
- cCc : ARRAY [VEOF..VTIME] OF ccT;
- #else
- cCc : ARRAY ccIdx OF ccT;
- #endif
- END;
-
-
- TYPE
- AttrActions = (
- TCSANOW,
- (* Terminalattribute werden sofort gesetzt. *)
- TCSADRAIN,
- (* Terminalattribute werden gesetzt, sobald alle gepufferten Ausgaben
- geschrieben wurden. *)
- TCSAFLUSH
- (* Wie 'TCSADRAIN', aber entfernt alle Eingaben, die bis zum Setzen
- der Attribute noch nicht gelesen wurden. *)
- );
-
- TYPE
- FlowActions = (
- TCOOFF,
- (* Alle Ausgaben vom System anhalten. *)
- TCOON,
- (* Die Ausgaben vom System wieder einschalten. *)
- TCIOFF,
- (* System sendet ein 'STOP'-Zeichen, damit das Terminal keine Daten
- mehr senden soll. *)
- TCION
- (* System sendet ein 'START'-Zeichen, damit das Terminal wieder senden
- soll. *)
- );
-
- TYPE
- QueueTypes = (
- TCIFLUSH,
- (* Alle noch nicht gelesenen Eingaben werden geloescht. *)
- TCOFLUSH,
- (* Alle noch nicht gesendeten Ausgaben werden geloescht. *)
- TCIOFLUSH
- (* 'TCIFLUSH' + 'TCOFLUSH' *)
- );
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- PROCEDURE isatty ((* EIN/ -- *) fd : INTEGER ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Liefert einen Wert groesser Null, falls <fd> das Handle eines (Pseudo) |
- | Terminals ist. |
- | |
- | GEMDOS: Der Test wird mit "DosSupport.IsTerm()" durchgefuehrt. |
- | MiNT: -""- |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE ttyname ((* EIN/ -- *) fd : INTEGER ): StrPtr;
-
- (*--------------------------------------------------------------------------
- | Falls <fd> ein Terminal repraesentiert, wird ein Zeiger auf den Pfadnamen|
- | fuer dieses Terminal geliefert. Dieser Zeiger bleibt gueltig, bis erneut |
- | "ttyname()" oder "ctermid()" aufgerufen wird. Falls <fd> kein Terminal |
- | repraesentiert, wird NULL zurueckgeliefert. |
- | |
- | GEMDOS: <fd> = -2 liefert "/dev/aux", sonst "/dev/tty". |
- | MiNT: Keine Besonderheiten. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE ctermid ((* EIN/ -- *) buf : StrPtr ): StrPtr;
-
- (*--------------------------------------------------------------------------
- | Die Funktion liefert den Pfadnamen des Kontrollterminals fuer diesen |
- | Prozess, unabhaengig davon, ob der Prozess gerade ein Kontrollterminal |
- | besitzt. Wenn <buf> NULL ist, wird ein Zeiger auf einen internen Puffer |
- | geliefert, der bis zum naechsten "ctermid()" oder "ttyname()" gueltig |
- | bleibt, sonst wird der Name nach <buf> kopiert, der auf ein Feld von |
- | mindestens 'LCtermid' Zeichen zeigen muss, und <buf> als Funktionswert |
- | geliefert. |
- | |
- | GEMDOS: liefert "/dev/tty". |
- | MiNT: Wenn ein Fehler auftritt, ist der Name "". |
- --------------------------------------------------------------------------*)
-
-
-
- PROCEDURE cfgetispeed ((* EIN/ -- *) term : TermiosRec ): speedT;
-
- PROCEDURE cfsetispeed ((* EIN/ -- *) term : TermiosRec;
- (* EIN/ -- *) speed : speedT ): INTEGER;
-
- PROCEDURE cfgetospeed ((* EIN/ -- *) term : TermiosRec ): speedT;
-
- PROCEDURE cfsetospeed ((* EIN/ -- *) term : TermiosRec;
- (* EIN/ -- *) speed : speedT ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Dienen dem Ermitteln und Veraendern der Ein- und Ausgabegeschwindigkeit, |
- | die in Variablen des Typs 'TermiosRec' kodiert ist. Die neuen Geschwin- |
- | digkeiten werden nur in den uebergebenen Variablen manipuliert, zum |
- | Setzen der Geschwindigkeiten ist "tcsetattr()" zu verwenden. |
- | |
- | "cfgetispeed()": Ermittelt die in <term> kodierte Eingabegeschwindigkeit.|
- | "cfsetispeed()": Kodiert die Eingabegeschwindigkeit in <term>. |
- | "cfgetospeed()": Ermittelt die in <term> kodierte Ausgabegeschwindigkeit.|
- | "cfsetospeed()": Kodiert Ausgabegeschwindigkeit in <term>. |
- | |
- | GEMDOS: Keine Besonderheiten. |
- | MiNT: -""- |
- --------------------------------------------------------------------------*)
-
-
-
- PROCEDURE tcgetattr ((* EIN/ -- *) fd : INTEGER;
- (* -- /AUS *) VAR term : TermiosRec ): INTEGER;
-
- PROCEDURE tcsetattr ((* EIN/ -- *) fd : INTEGER;
- (* EIN/ - *) act : AttrActions;
- (* EIN/AUS *) term : TermiosRec ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | "tcgetattr()" ermittelt die Terminalattribute, wenn <fd> die Kennung |
- | eines Terminals ist. Die entsprechenden Werte werden in <term> gesetzt. |
- | |
- | "tcsetattr()" setzt die Terminalattribute, wenn <fd> die Kennung eines |
- | Terminals ist, auf die Werte in <term>. <act> gibt an, zu welchem Zeit- |
- | punkt die neuen Werte gesetzt werden (siehe 'AttrActions'). Wenn die |
- | Attribute des Kontrollterminals gesetzt werden sollen, darf der Prozess |
- | kein Hintergrundprozess sein. |
- | Die Funktion meldet Erfolg, solange mindestens eins der neuen Attribute |
- | gesetzt werden konnte; es wird erst ein Fehler gemeldet, wenn kein |
- | einziges Attribut gesetzt werden konnte! |
- | |
- | GEMDOS: (noch) nicht implementiert |
- | MiNT: -""- |
- --------------------------------------------------------------------------*)
-
-
-
-
- PROCEDURE tcsendbreak ((* EIN/ -- *) fd : INTEGER;
- (* EIN/ -- *) duration : INTEGER ): INTEGER;
-
- PROCEDURE tcdrain ((* EIN/ -- *) fd : INTEGER ): INTEGER;
-
- PROCEDURE tcflow ((* EIN/ -- *) fd : INTEGER;
- (* EIN/ -- *) action : FlowActions ): INTEGER;
-
- PROCEDURE tcflush ((* EIN/ -- *) fd : INTEGER;
- (* EIN/ -- *) qsel : QueueTypes ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Fuer die folgenden Funktionen gilt: Wenn die Attribute des Kontrollter- |
- | minals gesetzt werden sollen, darf der Prozess kein Hintergrundprozess |
- | sein. |
- | |
- | "tcsendbreak()": Wenn <fd> die Kennung einer asynchronen (seriellen) |
- | Schnittstelle ist, wird eine ``Break condition'', d.h. |
- | eine Folge von Nullbits, gesendet. Falls <duration> = 0,|
- | dauert die Uebetragung mindestens eine Viertelsekunde; |
- | andere Werte fuehren zu einer systemspezifischen Dauer. |
- | |
- | "tcdrain()" : Der aufrufende Prozess wird solange blockiert, bis alle |
- | Ausgaben auf <fd> gesendet wurden. |
- | |
- | "tcflow()" : Kontrolliert die Ein- und Ausgabe gemaess <action> |
- | (siehe 'FlowActions'). |
- | |
- | "tcflush()" : Loescht gepufferte, aber noch nicht gelesene bzw. gesen-|
- | dete Ein- und Ausgaben; welche Daten geloescht werden, |
- | wird ueber <qsel> bestimmt (siehe 'QueueTypes'). |
- | |
- | GEMDOS: (noch) nicht implementiert |
- | MiNT: -""- |
- --------------------------------------------------------------------------*)
-
-
-
- PROCEDURE tcgetpgrp ((* EIN/ -- *) fd : INTEGER ): pidT;
-
- PROCEDURE tcsetpgrp ((* EIN/ -- *) fd : INTEGER;
- (* EIN/ -- *) pgrp : pidT ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | "tcgetpgrp()": Ermittelt die Prozessgruppenkennung der Vordergrundpro- |
- | zessgruppe des Kontrollterminals. |
- | "tcsetpgrp()": Setzt die Kennung der Vordergrundprozessgruppe fuer das |
- | Kontrollterminal auf <pgrp>. |
- | |
- | GEMDOS: Liefert immer -1 ('errno' = 'ENOSYS'). |
- | MiNT: Keine Besonderheiten. |
- --------------------------------------------------------------------------*)
-
- END term.
-